package Negocios;

import CDB.Categorias;
import CDB.PersonFactory;
import CDB.Producto;
import CDB.Stock;
import java.awt.HeadlessException;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 *
 * @author lightemp
 */
public class ControlProduct {

    private Session session;
    private Transaction transaction;
    private SessionFactory sessionFactory;

    public ControlProduct() {
    }

    public List selectAll() {
        List listaProductos;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                listaProductos = session.createQuery("from Producto p").list();
                return listaProductos;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            }
        } finally {
            session.close();
        }

        return null;
    }

    public int numRegistros() {
        int numProductos = 0;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                numProductos = session.createQuery("from Producto p").list().size();
                return numProductos;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            }
        } finally {
            session.flush();
            session.close();
        }
        return numProductos;
    }

    public Producto selectOne(int idproducto) {
        Producto prod = null;
        try {
            Session sessions = createSession();
            prod = (Producto) sessions.load(Producto.class, new Integer(idproducto));
            sessions.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        }
        return prod;
    }
    
    public List selectOnePDV(int idproducto){
        List list = null;
        try {
            Session sessions = createSession();
            //Creacion de query para obtener todos los detallesProducto con un id de producto especifico
            list = sessions.createQuery("from Producto p where p.idproducto=" + idproducto).list();
            sessions.close();
            //Retorno la lista con todos los detallesProducto
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error.",
                    0);
        }
        return list;
    }
    
    public Producto selectOneByName(String nombre) {
        Producto producto = null;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            if (session.createQuery("from Producto p where p.nombre='" + nombre + "'").list().size() > 0) {
                List lstpro = (List) session.createQuery("from Producto p where p.nombre='" + nombre + "'").list();
                producto = (Producto) lstpro.get(0);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            session.flush();
            session.close();
        }
        return producto;
    }

    public Producto getLast() {
        Producto producto;
        List lstproducto;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            String consulta = "from Producto order by idproducto desc";
            lstproducto = session.createQuery(consulta).setMaxResults(1).list();
            producto = (Producto) lstproducto.get(0);
            return producto;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
            return null;
        } finally {
            session.flush();
            session.close();
        }
    }

    public Producto selectOneById(long ID) {
        Producto producto;
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            try {
                producto = (Producto) session.createQuery("from Producto p where p.id=" + ID).list().get(0);
                return producto;
            } catch (HibernateException e) {
                JOptionPane.showMessageDialog(null, "error: " + e);
            }
        } catch (HibernateException | HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            session.flush();
            session.close();
        }

        return null;
    }

    public void add(String Nombre, Categorias Categoria, Stock Stock) {
        try {
            iniciaSF();
            //Creando un objeto
            Producto producto = new Producto();
            producto.setNombre(Nombre);
            producto.setCategorias(Categoria);
            producto.setStock(Stock);
            session.save(producto);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }



    }

    public void Update(int idProducto, String Nombre, Categorias Categoria, Stock Stock) {
        try {
            iniciaSF();

            Producto producto = (Producto) session.load(Producto.class,
                    new Integer(idProducto));

            producto.setNombre(Nombre);
            producto.setCategorias(Categoria);
            producto.setStock(Stock);
            session.update(producto);


        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }
    }
    
    public void Update(Producto producto) {
        try {
            iniciaSF();
            session.update(producto);
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }
    }

    public void delete(int idProducto) {
        try {
            iniciaSF();

            Producto producto = (Producto) session.load(Producto.class,
                    new Integer(idProducto));
            session.delete(producto);
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }

    }
    
    public void delete(Producto producto) {
        try {
            iniciaSF();
            session.delete(producto);
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error", 0);
        } finally {
            cierraSF();
        }

    }

    public void iniciaSF() {
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de producto.", "Error al iniciar Session",
                    0);
        }

    }

    public void cierraSF() {
        try {
            transaction.commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de producto.", "Error al cerrar Session",
                    0);
        }
    }

    public Session createSession() {

        Session sessions;
        try {
            //creando la nueva session para usar hibernate
            sessionFactory = PersonFactory.getSessionFactory();
            sessions = sessionFactory.openSession();
            return sessions;
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de producto.", "Error al crear Session",
                    0);
            session.close();
            return null;
        }
        
    }

    public List selectAllByCategory(int idCat) {
        List prod = null;
        try {
            Session sessions = createSession();
            prod = sessions.createQuery("from Producto p where p.categorias.idcategoria=" + idCat).list();
            sessions.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "error: " + e, "Ha ocurrido un error",
                    0);
        }
        return prod;
    }
}
